# 48. struct模块、hmac模块、处理TCP的粘包问题
# struct模块
struct 模块是一个可以将任意大小的数字转换成一个固定长度编码的模块0
struct模块在这里也暂时不会说太多,
unsigned 代表无符号
有符号int 和 无符号int的区别
有符号表示的是1个字节,8位,最高位是符号位,所以有符号的变量,一个字节表示范围:-128~127
无符号表示的是1个字节,8位,所有位都是数值,所以无符号的便利,一个字节表示范围:0-255
float和double
float表示单精度,一般的操作系统中表示为,将数值准确到小数点后 7~8位
double表示双精度,一般的操作系统中表示为,将数值准确到小数点后15~16位
void 指的是无返回值类型,在python中没有这种类型的数据
* 表示的是一级指针,指针的意思是:指向某一块内存地址
# struct模块的简单使用说明
struct.pack(type,num) ## 把指定的数据类型转换成固定长度的编码
# type:要转换的数据是什么类型的数据
# num:要转换的数据
struct.unpack(type,num) ## 把固定长度的编码转换成数据
# type:要转换的许编码是什么类型的数据
# num:要转换的编码
基本用于什么场景
可以用于解决TCP在传输过程出现的粘包情况
通过统计要发送的数据的大小,使用struct模块进行编码,固定为四字节的编码,在让服务端先接收四个字节的数据,反编码得到要传输的数据大小,在按这个大小,限制接下来接收的数据的大小
这样就可以解决TCP的粘包问题
# hmac模块
这个是另一种的加密算法模块
但是他跟hashib模块的不同之处
- hashlib模块:加密出来是一个字符串
- hmac模块:加密出来是bytes类型的数据
l
# hmac模块的简单使用
md5 = hmac.new(盐,需要加密的数据)
r = md5_obj.digest()
## 这样就可以拿到加密后的密文了
## 加密的密文是用mb5算法加密的
## 注意:盐是需要bytes类型的数据
简单使用
import hmac
import os
lib = os.urandom(16)
lib_b = "howo".encode("utf-8")
md5 = hmac.new(lib_b,lib)
r = md5.digest()
print(r)
执行结果:
b'8\xf3}\xc7\xb4\xfej\xfe\xe5\x13\xc0\x85l\x8b\xb2\xc2'
# 练习题 - 进度条
import time
for i in range(51):
time.sleep(0.2)
print('\r'+ i*'=' + '>' + str(i*3) + '%',end='')
## 为什么要加上时间模块,加上时间模块,只是给大家看一下效果
# 处理TCP粘包的思路
这里只说思路,实现在下面的项目中会运用到
在准备传输数据的时候,先对数据进行序列化,在对数据进行统计,把统计结果交给struct模块进行编码,因为struct模块的编码无论是对多大的数据,编码出来的结果,都是4个字节,在把编码后的4个字节数据加上要传输的数据,传输给服务端
然后,让服务端先接收4个字节的数据,进行解码,出来客户端要传输的数据的大小,在进行接收,在接收的时候限制接收的大小
这样就可以有效的实现TCP无粘包现象